package com.example.demo.leetcode;

import java.util.ArrayList;
import java.util.List;

/**
 * 链接：<a href="https://leetcode.cn/problems/zigzag-conversion/description/?envType=study-plan-v2&envId=top-interview-150">https://leetcode.cn/problems/zigzag-conversion/description/?envType=study-plan-v2&envId=top-interview-150</a>
 * <br>
 * <br>
 * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
 * <p>
 * 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下： <br>
 * P ___ A ___ H ___ N <br>
 * A _P_L _S_ I _ I _ G <br>
 * Y ___ I ___  R<br>
 * <p>
 * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。
 */
public class _6_Z字形变换 {

    public static void main(String[] args) {
        String paypalishiring = new Solution().convert("A", 1);
        System.out.println(paypalishiring);
    }

    public static class Solution {
        /**
         * 自己总结出的方法
         */
        public String convert(String s, int numRows) {
            //当numRows为1时，或者当字符串长度小于等于numRows时，直接返回数据s
            if (numRows == 1 || s.length() <= numRows) {
                return s;
            }
            //变换周期
            //例如：PAYPALISHIRING 长度为13 当numRows=3时，一个周期的数据下表就是从0到3，四个数
            int i = numRows + numRows - 1 - 1;

            //按照变换周期的下标，把字符串截取成几个子串：PAYP，ALIS，HIRI，NG
            List<String> list = new ArrayList<>();
            for (int j = 0; j < s.length(); j += i) {
                if (j + i < s.length()) {
                    list.add(s.substring(j, j + i));
                } else {
                    list.add(s.substring(j));
                }
            }

            //规律：
            //第一行是每个子串的第一个字符
            //第二行是每个子串的第二个字符和倒数第一个字符
            //第三行是每个子串的第三个字符和导出第二个字符
            //...
            StringBuilder sb = new StringBuilder();
            //首行
            for (String s1 : list) {
                sb.append(s1.charAt(0));
            }
            //后面每一行
            for (int j = 1, k = i - 1; j <= k; j++, k--) {
                for (String s1 : list) {
                    if (s1.length() > j) {
                        sb.append(s1.charAt(j));
                    }
                    if (s1.length() > k && j < k) {
                        sb.append(s1.charAt(k));
                    }
                }
            }
            return sb.toString();
        }



    }
}
